package org.example.npc.controller;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.listener.PageReadListener;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import com.example.commons.common.Result;
import com.example.commons.entity.NpcType;
import com.example.commons.entity.Npc;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import org.example.npc.service.NpcTypeService;
import org.example.npc.service.NpcService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.List;

/**
 * @program: authority-v3.0.7
 * @ClassName:NpcController
 * @description: NpcController前端控制器
 * @author:dyy
 * @Version 3.0
 **/

@Tag(name = "npc列表 前端控制器")
@RestController
@RequestMapping("/npc")
public class NpcController {
        @Resource
        private NpcService npcService;

        @Resource
        private NpcTypeService npcTypeService;


        /**
         * 新增
         *
         * @param npc
         * @return
         */
        @Operation(summary = "新增")
        @PostMapping
        public Result save(@RequestBody Npc npc) { return Result.success(npcService.save(npc)); }


        /**
         * 修改
         *
         * @param npc
         * @return
         */
        @Operation(summary = "修改")
        @PutMapping("/{id}")
        public Result update(@PathVariable Long id, @RequestBody Npc npc) {
                return Result.success(npcService.updateById(npc));
        }


        /**
         * 查询所有Npc
         *
         * @return
         */
        @Operation(summary = "查询所有Npc")
        @GetMapping
        public Result findAll() { return Result.success(npcService.list()); }


        /**
         * 获取单个
         *
         * @param id
         * @return
         */
        @Operation(summary = "获取单个")
        @GetMapping("/{id}")
        public Result findOne(@PathVariable Integer id) { return Result.success(npcService.getById(id)); }


        /**
         * 分页显示
         *
         * @param
         * @param pageNum
         * @param pageSize
         * @return
         */
        @Operation(summary = "分页显示")
        @GetMapping("/page")
        public Result findPage(@RequestParam(defaultValue = "") String name, @RequestParam(defaultValue = "") Long aid, @RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize) {
                LambdaQueryWrapper<Npc> queryWrapper = new LambdaQueryWrapper();

                if (StrUtil.isNotEmpty(name)) {
                        // name 不为空且不是空字符串的处理逻辑
                        queryWrapper.like(Npc::getName, name);
                }
                if (aid != null && aid != 0) {
                        // name 不为空且不是空字符串的处理逻辑
                        queryWrapper.eq(Npc::getAid, aid);
                }

                queryWrapper.orderByDesc(Npc::getId);
                Page<Npc> page = npcService.page(new Page<>(pageNum, pageSize), queryWrapper);
                List<Npc> records = page.getRecords();
                for (Npc npc : records) {
                        NpcType npcType = npcTypeService.getById(npc.getAid());
                        if (ObjectUtil.isNotEmpty(npcType)) {
                                npc.setNpcType(npcType);
                        }
                }
                page.setRecords(records);
                return Result.success(page);
        }


        /**
         * 单个删除
         *
         * @param id
         * @return
         */
        @Operation(summary = "单个删除")
        @DeleteMapping("/{id}")
        public Result delete(@PathVariable Integer id) { return Result.success(npcService.removeById(id)); }


        /**
         * 批量删除
         *
         * @param ids
         * @return
         */
        @Operation(summary = "批量删除")
        @DeleteMapping("/batch/{ids}")
        @Transactional
        public Result deleteByIds(@PathVariable String[] ids) {
                return Result.success(npcService.removeByIds(Arrays.asList(ids)));
        }


        /**
         * 批量导出
         * 使用的技术为alibaba下面的easyexcel
         * 写数据
         *
         * @param ids
         * @return
         */
        @Operation(summary = "批量导出")
        @GetMapping("/batch/export/{ids}")
        public void exportByIds(@PathVariable String[] ids, HttpServletResponse response) throws IOException {
                List<Npc> list = npcService.listByIds(Arrays.asList(ids));
                response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
                response.setCharacterEncoding("utf-8");

                // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
                String fileName = URLEncoder.encode("npc导出数据", "UTF-8").replaceAll("\\+", "%20");
                response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
                EasyExcel.write(response.getOutputStream(), Npc.class).sheet("sheel1").doWrite(list);
        }


        /**
         * 批量导入
         * 使用的技术为alibaba下面的easyexcel
         * 读数据
         *
         * @param
         */
        @Operation(summary = "批量导入")
        @PostMapping("/batch/upload")
        public Result writeExcel(MultipartFile file) throws IOException {
                EasyExcel.read(file.getInputStream(), Npc.class, new PageReadListener<Npc>(dataList -> {
                        dataList.forEach(entity -> npcService.save(entity.toBuilder().id(null).build()));
                })).sheet().doRead();
                return Result.success();
        }
}